package data;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import englishChicken.Juego;

public class JDBCJuegoDAO implements IJuegoDAO{
	
	public void delete(String uid) {
		System.out.println("JDBCJuegoDAO: metodo delete");
		Session session=HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	session.delete("uid",uid);
    	session.getTransaction().commit();
    }

    public void insert(String uid, Juego j) {
    	System.out.println("JDBCJuegoDAO: metodo insert");
    	Juego s=this.selectByJID(uid);
    	if(s==null){
    		Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        	session.beginTransaction();
    		j.setUid(uid);
    		session.save(j);
        	session.flush();
        	session.getTransaction().commit();
    	}
    }
    
    public void update(Juego j){
		System.out.println("JDBCJuegoDAO: metodo update");
    	Juego s=this.selectByJID(j.getUid());
    	if(s!=null){
    		Session session=HibernateUtil.getSessionFactory().getCurrentSession();
        	session.beginTransaction();
    		session.update(j);
        	session.flush();
        	session.getTransaction().commit();
    	}
	}

    public Juego selectByName(String name){
    	System.out.println("JDBCJuegoDAO: metodo selectByName");
    	return select("nombre",name);
    }
    
    public Juego selectByJID(String jid){
    	System.out.println("JDBCJuegoDAO: metodo selectByJID");
    	return select("uid",jid);
    }
    
    private Juego select(String sBy, String by) {
    	System.out.println("JDBCJuegoDAO: metodo select");
    	Session session=HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	Juego peticion=(Juego)session.createQuery("from Juego as u where u."+sBy+" = ?")
    	.setString(0,by)
    	.uniqueResult();
    	Hibernate.initialize(peticion);
    	Hibernate.initialize(peticion.getEventosJ());
    	Hibernate.initialize(peticion.getJugadoresJ());
    	Hibernate.initialize(peticion.getPadrinosJ());
    	Hibernate.initialize(peticion.getSolicitudPadrinoJ());
    	session.getTransaction().commit();
    	return peticion;
    }
    
    @SuppressWarnings("unchecked")
    public List<Juego> selectMasJugados(int pagina){
    	System.out.println("JDBCJuegoDAO: metodo selectMasJugados");
    	Session session=HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	List<String> resultado=session.createSQLQuery("select j.uid from Juego as j, uJuegaJ as uj where j.uid=uj.jid group by j.uid order by count(*) desc limit "+(pagina*10)+",10").list();
    	Iterator<String> resIT=resultado.iterator();
    	List<Juego> peticion=new LinkedList<Juego>();
    	while(resIT.hasNext()){
    		Juego resAct=(Juego)session.load(Juego.class,resIT.next());
    		Hibernate.initialize(resAct);
    		Hibernate.initialize(resAct.getJugadores());
    		peticion.add(resAct);
    	}
    	session.getTransaction().commit();
    	return peticion;
    }
    
    @SuppressWarnings("unchecked")
    public List<Juego> selectMasNuevos(int pagina){
    	System.out.println("JDBCJuegoDAO: metodo selectMasNuevos");
    	Session session=HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	Query q=session.createQuery("from Juego as j order by j.fechaCreacion desc");
    	q.setFirstResult(pagina*10);
    	q.setMaxResults(pagina*10+10);
    	List<Juego> peticion=q.list();
    	session.getTransaction().commit();
    	return peticion;
    }
    
    public List<Juego> selectAll(){
    	System.out.println("JDBCJuegoDAO: metodo selectAll");
    	return selectStartWith("%");
    }
    
    @SuppressWarnings("unchecked")
    public List<Juego> selectStartWith(String startWith) {
    	System.out.println("JDBCJuegoDAO: metodo selectStartWith");
    	Session session=HibernateUtil.getSessionFactory().getCurrentSession();
    	session.beginTransaction();
    	List<Juego> resultado=session.createQuery("from Juego as u where nombre like ?")
    	.setString(0,startWith+"%")
    	.list();
    	Iterator<Juego> resIT=resultado.iterator();
    	while(resIT.hasNext()){
    		Juego resAct=resIT.next();
    		Hibernate.initialize(resAct);
        	Hibernate.initialize(resAct.getEventosJ());
        	Hibernate.initialize(resAct.getJugadoresJ());
        	Hibernate.initialize(resAct.getPadrinosJ());
        	Hibernate.initialize(resAct.getSolicitudPadrinoJ());
    	}
    	session.getTransaction().commit();
    	return resultado;
    }

}
